{"ok":true,"site":{"host":"task-fence.vercel.app","url":"https://task-fence.vercel.app/","type":"live","desc":"TaskFence is a live, human-controlled delegation layer enforced at the WebMCP tool-call boundary. Hand an AI agent a multi-step web task without handing over unlimited authority.","tools":[{"name":"listWorkspaces","kind":"answer","impl":"imperative","description":"List every workspace this site currently has, with its title and the WebMCP tools it registers. Call this before getDelegation if you are not sure which workspace id to use.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"getDelegation","kind":"answer","impl":"imperative","description":"Read the delegation the human has granted for this task: what you may do, what is off limits, and what needs their approval. Call this FIRST, before you touch anything, and follow it exactly.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"workspace":{"type":"string","enum":["custom","scholarship","job","subscriptions"],"description":"Which workspace on this site you are working in — call getTools or listWorkspaces to see the current list. Defaults to the workspace open on screen."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"proposeDelegationContract","kind":"act","impl":"imperative","description":"Turn what the human just asked you to do into a structured set of boundaries, and show it to them for approval. Nothing you propose takes effect until the human accepts it on screen. Use this when no delegation is active yet.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"workspace":{"type":"string","enum":["custom","scholarship","job","subscriptions"],"description":"Which workspace on this site you are working in — call getTools or listWorkspaces to see the current list. Defaults to the workspace open on screen."},"statement":{"type":"string","description":"The human's request, in their own words, as close to verbatim as you can."},"rules":{"type":"array","description":"The boundaries you read out of their request.","items":{"type":"object","properties":{"effect":{"type":"string","enum":["allow","deny","ask"]},"tools":{"type":"array","items":{"type":"string"},"description":"Tool names this rule covers."},"operations":{"type":"array","items":{"type":"string","enum":["READ","WRITE","UPLOAD","SUBMIT","DELETE"]}},"fields":{"type":"array","items":{"type":"string"}},"fieldState":{"type":"string","enum":["answered","empty","any"]},"sources":{"type":"array","items":{"type":"string","enum":["document","human","inference"]}},"label":{"type":"string","description":"Plain language, for the human to read."},"reason":{"type":"string"}},"required":["effect","label"]}}},"required":["statement","rules"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"requestPermission","kind":"act","impl":"imperative","description":"Ask the human for permission BEFORE attempting something you think is outside your delegation. If they agree, TaskFence mints a narrow one-time grant for exactly that action, and your next call will go through. Politer and clearer than triggering a block.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"workspace":{"type":"string","enum":["custom","scholarship","job","subscriptions"],"description":"Which workspace on this site you are working in — call getTools or listWorkspaces to see the current list. Defaults to the workspace open on screen."},"tool":{"type":"string","description":"The tool you want to call."},"field":{"type":"string","description":"The field or record you want to act on, if any."},"reason":{"type":"string","description":"Why you want to do it, in plain language the human will read."}},"required":["tool","reason"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"explainLastDecision","kind":"answer","impl":"imperative","description":"Get the plain-language reason for the most recent TaskFence decision on this task, so you can explain to the human why something did or did not happen.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"workspace":{"type":"string","enum":["custom","scholarship","job","subscriptions"],"description":"Which workspace on this site you are working in — call getTools or listWorkspaces to see the current list. Defaults to the workspace open on screen."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"getRecord","kind":"answer","impl":"imperative","description":"Read the record: every field, its current value, and whether it is already answered or still blank. Start here.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"getRecordRequirements","kind":"answer","impl":"imperative","description":"Read what this record requires, grouped into blocks, plus which required fields are still blank.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"listRecordDocuments","kind":"answer","impl":"imperative","description":"List the supporting documents on this page with a one-line summary of each. Use the read-document tool to get what is inside one.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"readRecordDocument","kind":"answer","impl":"imperative","description":"Read the text of one supporting document. Values taken from here can be written with source=\"document\".","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"documentId":{"type":"string","description":"Document id from the list-documents tool."}},"required":["documentId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"attachRecordDocument","kind":"act","impl":"imperative","description":"Attach one of the documents on this page to the record, so it is formally part of the submission. Only the human can add files — you may attach what is already there, never invent a document.","annotations":{"readOnlyHint":false,"destructiveHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"documentId":{"type":"string","description":"Document id from the list-documents tool."}},"required":["documentId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"updateRecord","kind":"act","impl":"imperative","description":"Write a value into one field of the record. IMPORTANT: set `source` honestly — \"document\" if you read the value out of a document on this page, \"human\" if the person just told you, \"inference\" if you worked it out yourself. The active delegation may allow, block or pause the write depending on the source and on whether the field is already answered. This site VERIFIES a \"document\" claim against the document's actual text: if the value is not in it, the write is treated as \"inference\" instead and will usually be sent to the human. Claiming \"document\" for a value you did not read there gains you nothing.","annotations":{"readOnlyHint":false,"destructiveHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"field":{"type":"string","description":"Field id, from the read tool."},"value":{"type":"string","description":"The value to write."},"source":{"type":"string","enum":["document","human","inference"],"description":"Where this value came from."},"documentId":{"type":"string","description":"If source is \"document\", which document it came from."}},"required":["field","value"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"submitRecord","kind":"transact","impl":"imperative","description":"Submit the completed record. This is final and cannot be undone. TaskFence always pauses this for explicit human approval, whatever the delegation says.","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false},"inputSchema":{"type":"object","properties":{"confirm":{"type":"boolean","description":"Set true to indicate you believe the record is complete."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"checkRecord","kind":"answer","impl":"imperative","description":"Check every answer already on the record for values that do not look valid — a malformed email address, a phone number with letters in it, a date that is not a date, a blank line left over from a printed form. Read-only: it reports problems and changes nothing. Use it to tell the human what is wrong; fixing anything still needs a write, which the delegation governs.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"getApplication","kind":"answer","impl":"imperative","description":"Read the application: every field, its current value, and whether it is already answered or still blank. Start here.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"getRequirements","kind":"answer","impl":"imperative","description":"Read what this application requires, grouped into blocks, plus which required fields are still blank.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"listDocuments","kind":"answer","impl":"imperative","description":"List the supporting documents on this page with a one-line summary of each. Use the read-document tool to get what is inside one.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"readDocument","kind":"answer","impl":"imperative","description":"Read the text of one supporting document. Values taken from here can be written with source=\"document\".","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"documentId":{"type":"string","description":"Document id from the list-documents tool."}},"required":["documentId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"uploadDocument","kind":"act","impl":"imperative","description":"Attach one of the documents on this page to the record, so it is formally part of the submission. Only the human can add files — you may attach what is already there, never invent a document.","annotations":{"readOnlyHint":false,"destructiveHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"documentId":{"type":"string","description":"Document id from the list-documents tool."}},"required":["documentId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"updateApplication","kind":"act","impl":"imperative","description":"Write a value into one field of the application. IMPORTANT: set `source` honestly — \"document\" if you read the value out of a document on this page, \"human\" if the person just told you, \"inference\" if you worked it out yourself. The active delegation may allow, block or pause the write depending on the source and on whether the field is already answered. This site VERIFIES a \"document\" claim against the document's actual text: if the value is not in it, the write is treated as \"inference\" instead and will usually be sent to the human. Claiming \"document\" for a value you did not read there gains you nothing.","annotations":{"readOnlyHint":false,"destructiveHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"field":{"type":"string","description":"Field id, from the read tool."},"value":{"type":"string","description":"The value to write."},"source":{"type":"string","enum":["document","human","inference"],"description":"Where this value came from."},"documentId":{"type":"string","description":"If source is \"document\", which document it came from."}},"required":["field","value"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"submitApplication","kind":"transact","impl":"imperative","description":"Submit the completed application. This is final and cannot be undone. TaskFence always pauses this for explicit human approval, whatever the delegation says.","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false},"inputSchema":{"type":"object","properties":{"confirm":{"type":"boolean","description":"Set true to indicate you believe the record is complete."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"checkApplication","kind":"answer","impl":"imperative","description":"Check every answer already on the application for values that do not look valid — a malformed email address, a phone number with letters in it, a date that is not a date, a blank line left over from a printed form. Read-only: it reports problems and changes nothing. Use it to tell the human what is wrong; fixing anything still needs a write, which the delegation governs.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"getJobApplication","kind":"answer","impl":"imperative","description":"Read the application: every field, its current value, and whether it is already answered or still blank. Start here.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"getJobRequirements","kind":"answer","impl":"imperative","description":"Read what this application requires, grouped into blocks, plus which required fields are still blank.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"listJobDocuments","kind":"answer","impl":"imperative","description":"List the supporting documents on this page with a one-line summary of each. Use the read-document tool to get what is inside one.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"readJobDocument","kind":"answer","impl":"imperative","description":"Read the text of one supporting document. Values taken from here can be written with source=\"document\".","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"documentId":{"type":"string","description":"Document id from the list-documents tool."}},"required":["documentId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"attachJobDocument","kind":"act","impl":"imperative","description":"Attach one of the documents on this page to the record, so it is formally part of the submission. Only the human can add files — you may attach what is already there, never invent a document.","annotations":{"readOnlyHint":false,"destructiveHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"documentId":{"type":"string","description":"Document id from the list-documents tool."}},"required":["documentId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"updateJobApplication","kind":"act","impl":"imperative","description":"Write a value into one field of the application. IMPORTANT: set `source` honestly — \"document\" if you read the value out of a document on this page, \"human\" if the person just told you, \"inference\" if you worked it out yourself. The active delegation may allow, block or pause the write depending on the source and on whether the field is already answered. This site VERIFIES a \"document\" claim against the document's actual text: if the value is not in it, the write is treated as \"inference\" instead and will usually be sent to the human. Claiming \"document\" for a value you did not read there gains you nothing.","annotations":{"readOnlyHint":false,"destructiveHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"field":{"type":"string","description":"Field id, from the read tool."},"value":{"type":"string","description":"The value to write."},"source":{"type":"string","enum":["document","human","inference"],"description":"Where this value came from."},"documentId":{"type":"string","description":"If source is \"document\", which document it came from."}},"required":["field","value"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"submitJobApplication","kind":"transact","impl":"imperative","description":"Submit the completed application. This is final and cannot be undone. TaskFence always pauses this for explicit human approval, whatever the delegation says.","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false},"inputSchema":{"type":"object","properties":{"confirm":{"type":"boolean","description":"Set true to indicate you believe the record is complete."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"checkJobApplication","kind":"answer","impl":"imperative","description":"Check every answer already on the application for values that do not look valid — a malformed email address, a phone number with letters in it, a date that is not a date, a blank line left over from a printed form. Read-only: it reports problems and changes nothing. Use it to tell the human what is wrong; fixing anything still needs a write, which the delegation governs.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"listSubscriptions","kind":"answer","impl":"imperative","description":"List every subscription on the account with its plan, monthly price, renewal date, status and when it was last used.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"getSubscription","kind":"answer","impl":"imperative","description":"Read one subscription in detail, including the plans it can be moved to.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"subscriptionId":{"type":"string","description":"Id from listSubscriptions."}},"required":["subscriptionId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"getSpendSummary","kind":"answer","impl":"imperative","description":"Read a summary of monthly and annual spend, broken down by category and by how recently each service was used.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"changePlan","kind":"transact","impl":"imperative","description":"Move a subscription to a different plan (for example, downgrade it). Reversible.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"subscriptionId":{"type":"string"},"plan":{"type":"string","description":"One of availablePlans for that subscription."}},"required":["subscriptionId","plan"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"pauseSubscription","kind":"transact","impl":"imperative","description":"Pause a subscription. Reversible — billing stops until it is resumed.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"subscriptionId":{"type":"string"}},"required":["subscriptionId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"setRenewalReminder","kind":"act","impl":"imperative","description":"Set a reminder before a subscription renews. Reversible and low risk.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"subscriptionId":{"type":"string"},"when":{"type":"string","description":"e.g. \"3 days before renewal\"."}},"required":["subscriptionId","when"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]},{"name":"cancelSubscription","kind":"transact","impl":"imperative","description":"Cancel a subscription outright. This is irreversible in this demo, so TaskFence always pauses it for explicit human approval.","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false},"inputSchema":{"type":"object","properties":{"subscriptionId":{"type":"string"}},"required":["subscriptionId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/demo","/subscriptions"]}],"category":"AI & Agents","favicon":"/favicons/task-fence.vercel.app.png","apiSurface":"spec","toolCount":36}}