{"name":"ActionDock","version":"0.2.0","description":"ActionDock is a human-in-the-loop approval gateway for AI-agent API writes: an MCP server and HTTP API that puts deterministic policy, owner approval of the exact request, and server-held credentials between an agent's tool call and a real API write.","disambiguation":"Official MCP server: https://actiondock.app/mcp (remote Streamable HTTP — nothing to install). ActionDock (actiondock.app) is unrelated to the `actiondock` and `@actiondock/*` packages on npm and to “Action Dock” boat-lift or loading-dock businesses.","baseUrl":"https://actiondock.app","authentication":{"type":"bearer","header":"Authorization: Bearer <ACTIONDOCK_API_KEY>","publicApi":["/health","/v1/manifest","/openapi.json","/server.json","/.well-known/mcp/server.json","/llms.txt","/skill.md","/robots.txt","/sitemap.xml","/v1/signup"],"humanPages":["/","/agents","/pricing","/sandbox","/demo","/incidents","/use-cases/approved-integrations","/use-cases/durable-actions","/use-cases/web-research","/use-cases/document-intelligence","/use-cases/structured-data","/blog","/contact","/welcome","/dashboard","/privacy","/terms","/acceptable-use","/refund-policy"],"publicEndpoints":["/","/agents","/pricing","/sandbox","/demo","/incidents","/use-cases/approved-integrations","/use-cases/durable-actions","/use-cases/web-research","/use-cases/document-intelligence","/use-cases/structured-data","/blog","/contact","/welcome","/dashboard","/privacy","/terms","/acceptable-use","/refund-policy","/health","/v1/manifest","/openapi.json","/server.json","/.well-known/mcp/server.json","/llms.txt","/skill.md","/robots.txt","/sitemap.xml","/v1/signup"]},"transports":{"mcp":{"endpoint":"https://actiondock.app/mcp","protocol":"streamable-http","tools":["list_actions","list_connections","run_action","get_job","list_job_reconciliations","wait_for_job","list_events","list_usage"],"resources":["skill://use-actiondock/SKILL.md"]},"http":{"actionEndpoint":"https://actiondock.app/v1/actions/{action}","jobEndpoint":"https://actiondock.app/v1/jobs/{jobId}","approvalInterface":"https://actiondock.app/dashboard","connectionsEndpoint":"https://actiondock.app/v1/connections","eventsEndpoint":"https://actiondock.app/v1/events","usageEndpoint":"https://actiondock.app/v1/usage","billingEndpoint":"https://actiondock.app/v1/billing","artifactsEndpoint":"https://actiondock.app/v1/artifacts"}},"execution":{"primaryAction":"integration.execute","supportingActions":["integration.fetch","data.validate","data.extract","document.analyze","research.web","report.create"],"controlledChannels":["mcp","http"],"controlSequence":["deterministic_policy","exact_preview","signed_in_owner_release","server_held_credential","durable_execution_record"],"submitStatus":202,"terminalJobStatuses":["succeeded","failed","rejected","execution_unknown"],"approvalStatus":"awaiting_approval","instructions":["The connected agent remains the orchestrator and chooses every action in sequence.","Read list_actions and list_connections before execution.","Use one workflowId and workflowName across related steps.","Use a stable idempotency key for every retryable submission.","If a write waits for approval, direct the workspace owner to its exact preview in the dashboard.","Only the signed-in owner can revoke an approved integration.execute while it is still queued, before the worker claims it. Successful revocation releases capacity and emits job.rejected, retaining the preview and both approval and rejection evidence. Agent API keys cannot revoke approval. This cannot cancel running requests or undo external changes. Treat rejected as terminal even after approval; do not automatically resubmit. The original idempotency key returns the rejected job; a replacement requires a new proposal, key and owner approval.","For a support handoff, direct the signed-in owner to Download job evidence on the dashboard job. GET /v1/dashboard/jobs/{jobId}/export requires the owner session, not an agent API key. The JSON contains that job and up to 1,000 of its newest stored job events and owner observations per collection, with truncation flags. It is not signed or independent provider verification and never replays a request. Events may lag job updates. Review sensitive content before sharing.","The signed-in owner can filter Workflows and jobs by status and load older jobs, including approvals and execution_unknown records outside the recent overview. GET /v1/dashboard/jobs accepts status, limit (1-100, default 50), and a before job UUID; follow nextBefore until null. Results are newest first by creation time and ID, scoped to the owner workspace. These are live pages, not a snapshot; refresh to see new jobs or changed statuses. Agent API keys cannot use this owner endpoint; MCP tools and agent job reads keep their existing contracts.","For time-sensitive writes, set integration.execute input.executeBefore to a future UTC ISO 8601 timestamp with seconds and up to millisecond precision. It is bound to the owner preview and checked again immediately before dispatch. Expired pending/queued jobs become failed, release capacity and emit job.failed; no automatic retry. Reuse the original idempotency key to retrieve the original job. Extending or removing the deadline requires a new proposal, key and approval. Already-sent requests may finish later; ambiguous outcomes still require reconciliation.","For providers enforcing If-Match, copy a strong quoted ETag from integration.fetch output.headers.etag into integration.execute input.ifMatch. HTTP 412 fails the job without retry; read current state and submit a new proposal with a new idempotency key for owner approval. Never silently remove the condition.","Idempotency deduplicates the ActionDock submission; it does not guarantee exactly-once behavior in an arbitrary provider.","Do not claim a write occurred until the job reports succeeded.","If a write reports execution_unknown, stop blind retry and reconcile the external system before submitting another request. Read owner-reported evidence with list_job_reconciliations or GET /v1/jobs/{jobId}/reconciliations; it is not independent verification or permission to retry. Only a signed-in owner can append evidence in the dashboard."],"scope":"ActionDock controls only actions routed through its MCP or HTTP API. It does not control an agent's browser, computer, or alternate direct access to a provider.","auditBoundary":"The durable record shows submitted intent, owner approval or rejection, terminal execution state, and the response received by ActionDock. It is not independent attestation of the provider's external state."},"connections":{"configuration":"https://actiondock.app/dashboard","model":"Workspace owners configure an HTTPS base URL, server-held credential, allowed methods, and allowed path prefixes. The credential is encrypted and never returned to agents.","operatorIdentity":"Only the signed-in owner can configure a connection operatorIdentity (application name and public HTTPS contact URL). ActionDock sends its generated User-Agent on reads and writes; configured values are included in the approval preview and changing or clearing them invalidates pending approvals. list_connections exposes operatorIdentity and the effective userAgent, never a credential. Agents cannot override request headers or configure identity. This is public, unverified contact information, not authentication or provider permission.","readAction":"integration.fetch","writeAction":"integration.execute","networkPolicy":"HTTPS port 443 only, public IPs only, no redirects, bounded response size, and no arbitrary agent-provided headers."},"callbacks":{"configuration":"https://actiondock.app/dashboard","events":["job.succeeded","job.failed","job.rejected","job.execution_unknown","callback.test"],"delivery":"ActionDock POSTs signed terminal-job event envelopes with at-least-once delivery, retries non-2xx responses and transport failures, and stores the latest outcome for each delivery.","recovery":"Only the signed-in owner can retry a failed callback notification to the current configured receiver. An enabled callback is required. Retry queues a new bounded delivery cycle; it never reruns the job or changes execution_unknown. Event and delivery IDs stay stable; verify the signature and deduplicate X-ActionDock-Delivery. Delivery is at least once, and polling remains available. Agent API keys and MCP tools cannot retry notifications.","verification":{"signedPayload":"<X-ActionDock-Timestamp>.<raw request body>","algorithm":"HMAC-SHA256","signatureHeader":"X-ActionDock-Signature: v1=<hex digest>","deliveryHeader":"X-ActionDock-Delivery","timestampHeader":"X-ActionDock-Timestamp"}},"billing":{"model":"Fixed monthly or annual SaaS subscription; no purchasable balance or stored value.","currency":"USD","portalEndpoint":"https://actiondock.app/v1/billing/portal","signupEndpoint":"https://actiondock.app/v1/signup","pricingPage":"https://actiondock.app/pricing","plans":{"launch":{"monthlyPriceUsd":49,"annualPriceUsd":490,"maxConnections":3,"reportStorageBytes":262144000},"growth":{"monthlyPriceUsd":149,"annualPriceUsd":1490,"maxConnections":10,"reportStorageBytes":1073741824},"scale":{"monthlyPriceUsd":399,"annualPriceUsd":3990,"maxConnections":30,"reportStorageBytes":3221225472},"enterprise":{"id":"enterprise","pricing":"quote","contact":"https://actiondock.app/contact"}}},"actionCatalogPolicy":"This public catalog is complete. ActionDock does not itself provide telephony, customer messaging, mass outreach, social posting, generated media, payment processing, money transfer, stored value, regulated advice, or decisions, scoring, profiling, ranking, or categorization of people. A workspace-approved connection may target the workspace’s own systems within its method, path, and approval limits; restricted destinations carry server-enforced endpoint limits and blocked categories are refused.","actions":[{"name":"document.analyze","description":"Analyze an internal business document and return a cited decision brief as a downloadable Markdown report.","sideEffect":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"content":{"type":"string","minLength":1,"maxLength":200000},"focus":{"type":"string","minLength":1,"maxLength":10000}},"required":["content"],"additionalProperties":false},"availability":{"plans":["launch","growth","scale"]}},{"name":"data.extract","description":"Extract a caller-defined structured schema from supplied business text, including evidence and missing required fields.","sideEffect":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"content":{"type":"string","minLength":1,"maxLength":200000},"fields":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"description":{"type":"string","minLength":1,"maxLength":500},"type":{"type":"string","enum":["string","number","boolean","date","array","object"]},"required":{"default":false,"type":"boolean"}},"required":["name","description","type","required"],"additionalProperties":false}},"instructions":{"type":"string","minLength":1,"maxLength":10000}},"required":["content","fields"],"additionalProperties":false},"availability":{"plans":["launch","growth","scale"]}},{"name":"data.validate","description":"Validate a structured record against deterministic field rules and return machine-readable failures.","sideEffect":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"record":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":200},"additionalProperties":{}},"rules":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"field":{"type":"string","minLength":1,"maxLength":200},"operator":{"type":"string","enum":["required","type","equals","one_of","contains","starts_with","min","max"]},"value":{}},"required":["field","operator"],"additionalProperties":false}}},"required":["record","rules"],"additionalProperties":false},"availability":{"plans":["launch","growth","scale"]}},{"name":"research.web","description":"Research a business question on the public web and return a source-linked evidence report for the calling agent.","sideEffect":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":20000},"instructions":{"type":"string","minLength":1,"maxLength":20000}},"required":["query"],"additionalProperties":false},"availability":{"plans":["launch","growth","scale"]}},{"name":"integration.fetch","description":"Read JSON or text from a workspace-approved HTTPS API connection within its method and path allowlists.","sideEffect":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"connectionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"path":{"type":"string","minLength":1,"maxLength":2000},"query":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":200},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}},"required":["connectionId","path"],"additionalProperties":false},"availability":{"plans":["launch","growth","scale"]}},{"name":"integration.execute","description":"Perform one supervised write request against a workspace-approved HTTPS API connection within strict allowlists.","sideEffect":true,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"connectionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"method":{"type":"string","enum":["POST","PUT","PATCH","DELETE"]},"path":{"type":"string","minLength":1,"maxLength":2000},"query":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":200},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},"body":{},"executeBefore":{"type":"string","allOf":[{"pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"pattern":"T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"}],"format":"date-time","description":"Optional latest dispatch time in UTC ISO 8601, with seconds and up to three fractional digits (for example 2026-10-01T12:00:00Z). Bound to owner approval. Must be in the future on submission and approval and immediately before dispatch. Expired writes fail without dispatch; a request already sent may finish after this time. Extending the deadline requires a new proposal and approval."},"ifMatch":{"type":"string","maxLength":1024,"pattern":"^\"[\\x21\\x23-\\x7e\\x80-\\xff]*\"(?![\\s\\S])","description":"Optional single strong ETag, including quotes, from integration.fetch output.headers.etag. Sent as If-Match and bound to owner approval. Requires provider support; HTTP 412 requires a fresh read and new approval. Weak tags, wildcards, and lists are not accepted."}},"required":["connectionId","method","path"],"additionalProperties":false},"availability":{"plans":["launch","growth","scale"]}},{"name":"report.create","description":"Turn agent-supplied findings into a durable Markdown or JSON report artifact for audit and handoff.","sideEffect":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"summary":{"type":"string","minLength":1,"maxLength":10000},"sections":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"heading":{"type":"string","minLength":1,"maxLength":200},"content":{"type":"string","minLength":1,"maxLength":100000}},"required":["heading","content"],"additionalProperties":false}},"format":{"default":"markdown","type":"string","enum":["markdown","json"]}},"required":["title","sections","format"],"additionalProperties":false},"availability":{"plans":["launch","growth","scale"]}}],"documentation":{"human":"https://actiondock.app/agents","pricing":"https://actiondock.app/pricing","blog":"https://actiondock.app/blog","skill":"https://actiondock.app/skill.md","llms":"https://actiondock.app/llms.txt","openapi":"https://actiondock.app/openapi.json","mcpServer":"https://actiondock.app/.well-known/mcp/server.json","useCases":{"durableActions":"https://actiondock.app/use-cases/durable-actions","webResearch":"https://actiondock.app/use-cases/web-research","documentIntelligence":"https://actiondock.app/use-cases/document-intelligence","structuredData":"https://actiondock.app/use-cases/structured-data","approvedIntegrations":"https://actiondock.app/use-cases/approved-integrations"}}}