{"schemaVersion":1,"id":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation","title":"Agents that write to production: authorization, idempotency, and reconciliation","description":"An execution design for tools with real effects: identity outside the prompt, immutable actions, concurrency control, and recovery when a timeout leaves the result uncertain.","language":"en","datePublished":"2026-10-14","dateModified":null,"contentFormat":"text/markdown","content":"Agentic AI\n\n# Agents that write to production: authorization, idempotency, and reconciliation\n\n2026-10-147 min read\n\nLucio Durán\nEngineering Manager & AI Solutions Architect\n\nAlso available in: [Español](<https://lucioduran.com/es/blog/agent-tool-execution-authorization-idempotency-reconciliation>)\n\n## The timeout did not read your system prompt\n\nAn agent proposes updating a record. The API applies the change, and the connection breaks before returning a response. The agent sees an error and tries again. The dashboard shows two successful calls. The business receives two effects.\n\nThe probabilistic component selected an action. The deterministic component failed to execute it correctly. Switching models may produce a more elegant explanation of the same incident.\n\n**A write tool needs an execution protocol that survives retries, concurrency, and lost responses.** Here I propose one for an agent modifying operational configuration. The examples are illustrative designs, with no production results attributed to them.\n\n## Separate proposal, authorization, and execution\n\nThe model produces a proposal. A control service normalizes it, binds it to the authenticated identity, and decides whether it is allowed. An executor applies one specific operation and records the outcome.\n\n```text\nuser request\n  -> model proposal\n  -> validation and policy\n  -> immutable authorized action\n  -> executor\n  -> receipt or reconciliation\n```\n\nTool descriptions guide the model. Policy is enforced in code at the boundary where the effect occurs. “Use only when appropriate” in a prompt is not a particularly auditable access control.\n\nEach delegation receives the intersection of user, service, and task permissions. A subagent may have less authority than its parent. Creating a child grants no additional authority.\n\n## MCP covers part of the contract\n\nThe [July 2026 MCP authorization specification](<https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization>) defines authorization for HTTP transports and resource-bound tokens. Its [security guidance](<https://modelcontextprotocol.io/docs/2026-07-28/tutorials/security/security_best_practices>) prohibits token passthrough and describes confused deputy risks.\n\nAbove that layer, the application still has a domain question to answer: may this user change this attribute of this resource under these conditions? A valid server token does not automatically answer all of that.\n\nFor example, ` inventory.write ` could allow editing stock at one warehouse without granting access to another tenant or permitting arbitrary adjustment sizes. Policy may also require review for particular operations. The service owns those limits, independently of the explanation attached to the tool call.\n\n## Authorize exactly what will execute\n\nThe service turns the proposal into an immutable record. This JSON shows conceptual fields; the identifiers are fictional:\n\n```json\n{\n  \"operationId\": \"op_example_01\",\n  \"principalId\": \"user_example\",\n  \"tenantId\": \"tenant_example\",\n  \"tool\": \"inventory.set_available\",\n  \"resource\": \"warehouse_example/item_example\",\n  \"arguments\": { \"available\": 18 },\n  \"expectedVersion\": 42,\n  \"policyVersion\": \"inventory-policy-v3\",\n  \"authorizationId\": \"authz_example_01\",\n  \"expiresAt\": \"2026-10-14T18:05:00Z\"\n}\n```\n\nThe server generates ` operationId ` and obtains identity and tenant from the authenticated session. A canonical representation of the action can produce a digest binding authorization to the tool, resource, arguments, and preconditions. A hash alone does not prove who authorized anything: the record belongs in trusted storage or must travel with verifiable authenticity.\n\nWhen policy requires human approval, the interface shows the concrete change and its scope. Approving “fix the problem” does not authorize whatever write the model later finds convenient.\n\nThe executor checks expiry and revocation before applying a pending operation. Changing arguments invalidates the coverage of the old authorization. A relevant policy change triggers reevaluation. A confirmed receipt remains available even after the permission that enabled the action expires.\n\n## Close the gap between reading and writing\n\nIn this example, the agent read inventory version 42. Another operation creates version 43 before execution. Applying the original proposal without its precondition can overwrite information the agent never saw.\n\nStorage must compare and modify atomically. In HTTP, [` If-Match `](<https://www.rfc-editor.org/rfc/rfc9110.html#section-13.1.1>) can condition a write on a strong ETag. A false precondition prevents the change; the server may respond with ` 412 `.\n\nIn a custom implementation, I would use an update conditioned on tenant, identifier, and version, within the transaction that records the operation's result. If no row matches, the action needs a fresh read and decision. Checking the version with a ` GET ` and following it with an unconditional ` PUT ` leaves the race open.\n\nA version rejection is not an invitation to replace ` 42 ` with ` 43 ` and continue. The action's meaning may have changed. Automation needs an explicit conflict-resolution rule or must return the decision to the user.\n\n## A state machine that admits uncertainty\n\nI propose these states for the operation record:\n\n| State | What we know | Permitted next step |\n| --- | --- | --- |\n| ` proposed ` | Candidate arguments exist | Validate and authorize |\n| ` authorized ` | The exact action is permitted | Claim execution before expiry |\n| ` executing ` | An executor started the attempt | Await a receipt or investigate |\n| ` succeeded ` | Confirmation of the effect exists | Return the existing receipt |\n| ` rejected ` | The operation was denied before the effect | Report the reason |\n| ` unknown ` | The effect may have occurred | Reconcile before deciding |\n\nA timeout, broken connection, or dead process may produce ` unknown `. Labeling everything ` failed ` makes retry policy dangerous. “I received no confirmation” contains less information than “it did not happen.” The database should understand that distinction too.\n\nThe key ` (tenantId, operationId) ` identifies an authorized intent. The ledger prevents simultaneous claims and retains the receipt. The model does not mint a new identity whenever it receives the same error.\n\n## The boundary of the local transaction\n\nThe [Amazon Builders' Library](<https://aws.amazon.com/builders-library/making-retries-safe-with-idempotent-APIs/>) describes APIs with reusable request identifiers and rejection when the same identity arrives with different parameters. The applicable lesson is preserving intent across retries.\n\nFor a write to your own database, deduplication and mutation can share a transaction. With an external API, your local ledger does not control the remote commit. This is the part diagrams tend to hide underneath an arrow.\n\nAn outbox can atomically store delivery intent alongside local state. Delivery can still repeat. The receiver needs idempotency support or an operation that is safe to repeat under a documented contract.\n\nIf the provider retains keys for a limited period, recovery must respect that window. Reusing a key after expiry could execute again. An expired local lease also does not prove that the previous worker stopped acting; receiver-side guarantees are needed, such as deduplication or fencing where supported.\n\n## Reconcile by operation, not by resemblance\n\nThe reconciler queries the remote receipt using operation identity. If it finds a confirmed effect, it records it in the ledger. If it establishes that no effect occurred and the contract permits retrying, it reuses the same identity within the valid window.\n\nSeeing inventory at 18 does not prove our write happened. Another operation could have produced that value. Evidence must attribute the effect to the specific request.\n\nWhen a provider offers neither deduplication nor reliable lookup, uncertainty may require human intervention. Compensation is another operation with permissions, failures, and possible concurrent effects. A sent email does not return to the outbox because somebody wrote ` rollback() `.\n\n## What I would require before enabling autonomy\n\nI would exercise failures before sending, after the remote effect, and before persisting the receipt. I would add concurrent workers, expired authorizations, changed resources, altered parameters, and keys beyond retention.\n\nThe report would show uncertain operations, duplicate effects, rejected writes, and reconciliation time. Acceptance criteria are specific to each operation and provider. Guarantees end where the enforceable contract ends.\n\nMy requirement for an autonomous write tool is concrete: **explain who authorized what, against which version, how many times it was attempted, and what evidence confirms the effect**. If that explanation is missing, distributed systems work remains. The prompt can wait.\n\nRelated reading: [function calling and orchestration](<https://lucioduran.com/blog/llm-function-calling-tool-use-patterns>) and [event sourcing and event records](<https://lucioduran.com/blog/event-sourcing-cqrs-production-lessons>).\n\n## Frequently asked questions\n\n### Does a valid JSON Schema make a tool safe?\n\nNo. The schema can constrain request structure, but the executor must check identity, permissions, resource, preconditions, and operational limits.\n\n### Does an idempotency key guarantee exactly one execution?\n\nNot by itself. The system producing the effect must enforce deduplication with known guarantees. Key scope, retention, and handling of pending operations also matter.\n\n### What if an external API supports neither deduplication nor operation lookup?\n\nTreat an uncertain result as a case for manual reconciliation or redesign the integration. Automatically retrying a write can duplicate the effect.\n\n## Tips\n\n1. Tenant and identity come from authenticated context. Never from a field the model can invent.\n2. A timeout leaves an operation uncertain. Preserve its identity until the external effect is reconciled.\n3. Approval is bound to arguments, resource, and version. Changing any of them requires reevaluating authorization.\n\n- agentic-ai\n- tool-execution\n- mcp\n- authorization\n- idempotency\n- distributed-systems\n- reconciliation\n\n[Back to Blog](<https://lucioduran.com/blog>)","headings":[{"level":1,"text":"Agents that write to production: authorization, idempotency, and reconciliation","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#title"},{"level":2,"text":"The timeout did not read your system prompt","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#the-timeout-did-not-read-your-system-prompt"},{"level":2,"text":"Separate proposal, authorization, and execution","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#separate-proposal-authorization-and-execution"},{"level":2,"text":"MCP covers part of the contract","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#mcp-covers-part-of-the-contract"},{"level":2,"text":"Authorize exactly what will execute","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#authorize-exactly-what-will-execute"},{"level":2,"text":"Close the gap between reading and writing","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#close-the-gap-between-reading-and-writing"},{"level":2,"text":"A state machine that admits uncertainty","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#a-state-machine-that-admits-uncertainty"},{"level":2,"text":"The boundary of the local transaction","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#the-boundary-of-the-local-transaction"},{"level":2,"text":"Reconcile by operation, not by resemblance","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#reconcile-by-operation-not-by-resemblance"},{"level":2,"text":"What I would require before enabling autonomy","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#what-i-would-require-before-enabling-autonomy"},{"level":2,"text":"Frequently asked questions","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#questions"},{"level":3,"text":"Does a valid JSON Schema make a tool safe?","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#question-1"},{"level":3,"text":"Does an idempotency key guarantee exactly one execution?","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#question-2"},{"level":3,"text":"What if an external API supports neither deduplication nor operation lookup?","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#question-3"},{"level":2,"text":"Tips","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#article-tips"}],"sections":[{"heading":"Agents that write to production: authorization, idempotency, and reconciliation","level":1,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation","content":"Agentic AI"},{"heading":"Agents that write to production: authorization, idempotency, and reconciliation","level":1,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#title","content":"2026-10-147 min read\n\nLucio Durán\nEngineering Manager & AI Solutions Architect\n\nAlso available in: [Español](<https://lucioduran.com/es/blog/agent-tool-execution-authorization-idempotency-reconciliation>)"},{"heading":"The timeout did not read your system prompt","level":2,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#the-timeout-did-not-read-your-system-prompt","content":"An agent proposes updating a record. The API applies the change, and the connection breaks before returning a response. The agent sees an error and tries again. The dashboard shows two successful calls. The business receives two effects.\n\nThe probabilistic component selected an action. The deterministic component failed to execute it correctly. Switching models may produce a more elegant explanation of the same incident.\n\n**A write tool needs an execution protocol that survives retries, concurrency, and lost responses.** Here I propose one for an agent modifying operational configuration. The examples are illustrative designs, with no production results attributed to them."},{"heading":"Separate proposal, authorization, and execution","level":2,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#separate-proposal-authorization-and-execution","content":"The model produces a proposal. A control service normalizes it, binds it to the authenticated identity, and decides whether it is allowed. An executor applies one specific operation and records the outcome.\n\n```text\nuser request\n  -> model proposal\n  -> validation and policy\n  -> immutable authorized action\n  -> executor\n  -> receipt or reconciliation\n```\n\nTool descriptions guide the model. Policy is enforced in code at the boundary where the effect occurs. “Use only when appropriate” in a prompt is not a particularly auditable access control.\n\nEach delegation receives the intersection of user, service, and task permissions. A subagent may have less authority than its parent. Creating a child grants no additional authority."},{"heading":"MCP covers part of the contract","level":2,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#mcp-covers-part-of-the-contract","content":"The [July 2026 MCP authorization specification](<https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization>) defines authorization for HTTP transports and resource-bound tokens. Its [security guidance](<https://modelcontextprotocol.io/docs/2026-07-28/tutorials/security/security_best_practices>) prohibits token passthrough and describes confused deputy risks.\n\nAbove that layer, the application still has a domain question to answer: may this user change this attribute of this resource under these conditions? A valid server token does not automatically answer all of that.\n\nFor example, ` inventory.write ` could allow editing stock at one warehouse without granting access to another tenant or permitting arbitrary adjustment sizes. Policy may also require review for particular operations. The service owns those limits, independently of the explanation attached to the tool call."},{"heading":"Authorize exactly what will execute","level":2,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#authorize-exactly-what-will-execute","content":"The service turns the proposal into an immutable record. This JSON shows conceptual fields; the identifiers are fictional:\n\n```json\n{\n  \"operationId\": \"op_example_01\",\n  \"principalId\": \"user_example\",\n  \"tenantId\": \"tenant_example\",\n  \"tool\": \"inventory.set_available\",\n  \"resource\": \"warehouse_example/item_example\",\n  \"arguments\": { \"available\": 18 },\n  \"expectedVersion\": 42,\n  \"policyVersion\": \"inventory-policy-v3\",\n  \"authorizationId\": \"authz_example_01\",\n  \"expiresAt\": \"2026-10-14T18:05:00Z\"\n}\n```\n\nThe server generates ` operationId ` and obtains identity and tenant from the authenticated session. A canonical representation of the action can produce a digest binding authorization to the tool, resource, arguments, and preconditions. A hash alone does not prove who authorized anything: the record belongs in trusted storage or must travel with verifiable authenticity.\n\nWhen policy requires human approval, the interface shows the concrete change and its scope. Approving “fix the problem” does not authorize whatever write the model later finds convenient.\n\nThe executor checks expiry and revocation before applying a pending operation. Changing arguments invalidates the coverage of the old authorization. A relevant policy change triggers reevaluation. A confirmed receipt remains available even after the permission that enabled the action expires."},{"heading":"Close the gap between reading and writing","level":2,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#close-the-gap-between-reading-and-writing","content":"In this example, the agent read inventory version 42. Another operation creates version 43 before execution. Applying the original proposal without its precondition can overwrite information the agent never saw.\n\nStorage must compare and modify atomically. In HTTP, [` If-Match `](<https://www.rfc-editor.org/rfc/rfc9110.html#section-13.1.1>) can condition a write on a strong ETag. A false precondition prevents the change; the server may respond with ` 412 `.\n\nIn a custom implementation, I would use an update conditioned on tenant, identifier, and version, within the transaction that records the operation's result. If no row matches, the action needs a fresh read and decision. Checking the version with a ` GET ` and following it with an unconditional ` PUT ` leaves the race open.\n\nA version rejection is not an invitation to replace ` 42 ` with ` 43 ` and continue. The action's meaning may have changed. Automation needs an explicit conflict-resolution rule or must return the decision to the user."},{"heading":"A state machine that admits uncertainty","level":2,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#a-state-machine-that-admits-uncertainty","content":"I propose these states for the operation record:\n\n| State | What we know | Permitted next step |\n| --- | --- | --- |\n| ` proposed ` | Candidate arguments exist | Validate and authorize |\n| ` authorized ` | The exact action is permitted | Claim execution before expiry |\n| ` executing ` | An executor started the attempt | Await a receipt or investigate |\n| ` succeeded ` | Confirmation of the effect exists | Return the existing receipt |\n| ` rejected ` | The operation was denied before the effect | Report the reason |\n| ` unknown ` | The effect may have occurred | Reconcile before deciding |\n\nA timeout, broken connection, or dead process may produce ` unknown `. Labeling everything ` failed ` makes retry policy dangerous. “I received no confirmation” contains less information than “it did not happen.” The database should understand that distinction too.\n\nThe key ` (tenantId, operationId) ` identifies an authorized intent. The ledger prevents simultaneous claims and retains the receipt. The model does not mint a new identity whenever it receives the same error."},{"heading":"The boundary of the local transaction","level":2,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#the-boundary-of-the-local-transaction","content":"The [Amazon Builders' Library](<https://aws.amazon.com/builders-library/making-retries-safe-with-idempotent-APIs/>) describes APIs with reusable request identifiers and rejection when the same identity arrives with different parameters. The applicable lesson is preserving intent across retries.\n\nFor a write to your own database, deduplication and mutation can share a transaction. With an external API, your local ledger does not control the remote commit. This is the part diagrams tend to hide underneath an arrow.\n\nAn outbox can atomically store delivery intent alongside local state. Delivery can still repeat. The receiver needs idempotency support or an operation that is safe to repeat under a documented contract.\n\nIf the provider retains keys for a limited period, recovery must respect that window. Reusing a key after expiry could execute again. An expired local lease also does not prove that the previous worker stopped acting; receiver-side guarantees are needed, such as deduplication or fencing where supported."},{"heading":"Reconcile by operation, not by resemblance","level":2,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#reconcile-by-operation-not-by-resemblance","content":"The reconciler queries the remote receipt using operation identity. If it finds a confirmed effect, it records it in the ledger. If it establishes that no effect occurred and the contract permits retrying, it reuses the same identity within the valid window.\n\nSeeing inventory at 18 does not prove our write happened. Another operation could have produced that value. Evidence must attribute the effect to the specific request.\n\nWhen a provider offers neither deduplication nor reliable lookup, uncertainty may require human intervention. Compensation is another operation with permissions, failures, and possible concurrent effects. A sent email does not return to the outbox because somebody wrote ` rollback() `."},{"heading":"What I would require before enabling autonomy","level":2,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#what-i-would-require-before-enabling-autonomy","content":"I would exercise failures before sending, after the remote effect, and before persisting the receipt. I would add concurrent workers, expired authorizations, changed resources, altered parameters, and keys beyond retention.\n\nThe report would show uncertain operations, duplicate effects, rejected writes, and reconciliation time. Acceptance criteria are specific to each operation and provider. Guarantees end where the enforceable contract ends.\n\nMy requirement for an autonomous write tool is concrete: **explain who authorized what, against which version, how many times it was attempted, and what evidence confirms the effect**. If that explanation is missing, distributed systems work remains. The prompt can wait.\n\nRelated reading: [function calling and orchestration](<https://lucioduran.com/blog/llm-function-calling-tool-use-patterns>) and [event sourcing and event records](<https://lucioduran.com/blog/event-sourcing-cqrs-production-lessons>)."},{"heading":"Frequently asked questions","level":2,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#questions","content":""},{"heading":"Does a valid JSON Schema make a tool safe?","level":3,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#question-1","content":"No. The schema can constrain request structure, but the executor must check identity, permissions, resource, preconditions, and operational limits."},{"heading":"Does an idempotency key guarantee exactly one execution?","level":3,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#question-2","content":"Not by itself. The system producing the effect must enforce deduplication with known guarantees. Key scope, retention, and handling of pending operations also matter."},{"heading":"What if an external API supports neither deduplication nor operation lookup?","level":3,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#question-3","content":"Treat an uncertain result as a case for manual reconciliation or redesign the integration. Automatically retrying a write can duplicate the effect."},{"heading":"Tips","level":2,"url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#article-tips","content":"1. Tenant and identity come from authenticated context. Never from a field the model can invent.\n2. A timeout leaves an operation uncertain. Preserve its identity until the external effect is reconciled.\n3. Approval is bound to arguments, resource, and version. Changing any of them requires reevaluating authorization.\n\n- agentic-ai\n- tool-execution\n- mcp\n- authorization\n- idempotency\n- distributed-systems\n- reconciliation\n\n[Back to Blog](<https://lucioduran.com/blog>)"}],"links":[{"text":"Español","url":"https://lucioduran.com/es/blog/agent-tool-execution-authorization-idempotency-reconciliation"},{"text":"July 2026 MCP authorization specification","url":"https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization"},{"text":"security guidance","url":"https://modelcontextprotocol.io/docs/2026-07-28/tutorials/security/security_best_practices"},{"text":"If-Match","url":"https://www.rfc-editor.org/rfc/rfc9110.html#section-13.1.1"},{"text":"Amazon Builders' Library","url":"https://aws.amazon.com/builders-library/making-retries-safe-with-idempotent-APIs/"},{"text":"function calling and orchestration","url":"https://lucioduran.com/blog/llm-function-calling-tool-use-patterns"},{"text":"event sourcing and event records","url":"https://lucioduran.com/blog/event-sourcing-cqrs-production-lessons"},{"text":"Back to Blog","url":"https://lucioduran.com/blog"}],"structuredData":[{"@context":"https://schema.org","@graph":[{"@type":"BlogPosting","@id":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation#article","mainEntityOfPage":{"@type":"WebPage","@id":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation"},"headline":"Agents that write to production: authorization, idempotency, and reconciliation","description":"An execution design for tools with real effects: identity outside the prompt, immutable actions, concurrency control, and recovery when a timeout leaves the result uncertain.","datePublished":"2026-10-14","author":{"@type":"Person","@id":"https://lucioduran.com/#person","name":"Lucio Durán","url":"https://lucioduran.com"},"publisher":{"@type":"Person","@id":"https://lucioduran.com/#person","name":"Lucio Durán","url":"https://lucioduran.com"},"image":"https://lucioduran.com/favicons/og-default.png","url":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation","inLanguage":"en","isPartOf":{"@id":"https://lucioduran.com/blog#blog"},"articleSection":"Agentic AI","keywords":"agentic-ai, tool-execution, mcp, authorization, idempotency, distributed-systems, reconciliation","wordCount":1180,"timeRequired":"PT7M","workTranslation":[{"@type":"BlogPosting","inLanguage":"es","url":"https://lucioduran.com/es/blog/agent-tool-execution-authorization-idempotency-reconciliation"}]},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://lucioduran.com/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https://lucioduran.com/blog"},{"@type":"ListItem","position":3,"name":"Agents that write to production: authorization, idempotency, and reconciliation","item":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation"}]},{"@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Does a valid JSON Schema make a tool safe?","acceptedAnswer":{"@type":"Answer","text":"No. The schema can constrain request structure, but the executor must check identity, permissions, resource, preconditions, and operational limits."}},{"@type":"Question","name":"Does an idempotency key guarantee exactly one execution?","acceptedAnswer":{"@type":"Answer","text":"Not by itself. The system producing the effect must enforce deduplication with known guarantees. Key scope, retention, and handling of pending operations also matter."}},{"@type":"Question","name":"What if an external API supports neither deduplication nor operation lookup?","acceptedAnswer":{"@type":"Answer","text":"Treat an uncertain result as a case for manual reconciliation or redesign the integration. Automatically retrying a write can duplicate the effect."}}]}]}],"contentHash":"822432e299ce2e8a3dd2008efdbf57e10e5dcc76c149b432c5797b4c82394b29","provenance":{"method":"Deterministic serialization of the server-rendered main element","source":"https://lucioduran.com/blog/agent-tool-execution-authorization-idempotency-reconciliation","hashAlgorithm":"sha256","hashScope":"JSON document fields before contentHash and provenance","sourceHTMLBytes":57467,"contentBytes":10373}}
