# Drafts

Why each change to servers, roles and policy waits as a checked draft until a person publishes it, and who may propose one.

In short: Every change to MCP servers, roles and policy is a draft. Straza checks the draft against live state, and its documents go live together or not at all. A direct save is a draft of one item, published at once. Any other draft waits for a person to publish it, even when an AI agent or a token proposed it.


Adraftholdsthedocumentsofonechangeto[MCPservers](https://docs.straza.ai/concepts/mcp-apps-and-the-gateway/index.md),[roles](https://docs.straza.ai/concepts/roles-and-access/index.md)or[policy](https://docs.straza.ai/concepts/policy-model/index.md),whichalterswhatagentsmaydo.Strazacheckseachdraftagainstlivestateandshowswhatitwouldchange.A[person](https://docs.straza.ai/concepts/identities/index.md)thenpublishesit.Itsdocumentsgolivetogetherornotatall,andtherecordofthepublishnamesthatperson.Adirectsave,suchas**Saveandpublish**intheconsole,isadraftofoneitemthatStrazachecksandpublishesinthesamerequest.##WhatadraftgoesthroughAnewdraftischeckedatonce.Thechecksortswhatitfindsintolinesthatrefusethedraft,linesthatwidenaccess,warnings,andwhatitcouldnotcheck.Italsoshows,foreachrolethedrafttouches,whataholdergetsnowandafterpublishing.Arefusedlineblocksthepublishandsayswhattofix.Warningsdonotblockit.Thepersonwhopublishesconfirmseachlinethatwidensaccessbytickingit.Forachangethatpublishingtheoldstateagaincannotundo,theytypeitsnameinstead.Strazachecksthedraftagainasitpublishes.Ifanyobjectchangedsincethelastcheck,nothingiswritten,andthedraftmustbecheckedagainagainstthenewlivestate.Apublishedchangeistakenbackwithanewdraftoftheearlierstate,checkedlikeanyother.Discardingadraftchangesnothinglive.##Whomaydraftandwhomaypublish|Who|Maydraft|Maypublish||---|---|---||Apersonwithrightsoverservers,rolesorpolicy,oraserver'sadmin|Whatthoserightsletthemread|Yes,withstandingovereveryobjectinthedraft||AnadminAPItokenwiththedraftsscope|Yes,suchasapipelinethatsendsafolderoffiles|Neveradraft.Itsdirectchangeofoneobjectgoesliveinthesamerequest||AnAIagentthatholdstheStrazarole`straza-draft-config`|Yes,throughtwobuilt-intools|Never||Theappsdirectory|Onedraftforeachmanifestfilethatappears,changesorgoes|Never|Asessionthatacodingtoolcheckedinmaynotdraftthroughtheadminroutesorpublish,becausetheagentinsidethattoolholdsthesession.Adeploymentcanalsorequireasecondperson.Thenadraftthatwidensaccessorremovesaservercannotbepublishedbyanyonewhowrotearevisionofit,bywhoevermintedatokenthatwroteone,orbythesponsorofanagentthatwroteone.[Whomaydraftandpublish](https://docs.straza.ai/guides/changes/who-may-draft/index.md)setstheserulesup.##HowanagentproposesachangeAn[agent](https://docs.straza.ai/concepts/identities/index.md)proposesachangethroughthebuilt-instrazaMCPserver,withatoolthatsubmitsadraftandatoolthatreadsthedraft'scheck.Onlyasessionthatholds`straza-draft-config`seestheminthegateway.Theagentsendsthesamedocumentsapersonwould,withanoteforthereviewer.Theanswernamesthedraftandsaysthatapersonpublishesitontheconsoleunder**Drafts**andtheagentcannot.Everyadminrouterefusesanidentitythatisnotaperson,soanagentneverreachesthepublishroute,whateverroleitholds.Agentsmaynotpublishbecauseanagentthatcouldpublishcouldwidenitsownreach.Thecheckofanagent'sdraftrefusesachangethatwouldlettheagentreachmorethanitsrolesreachtoday,atanymomentoneofitsassignmentsstartsorends.Italsorefusesadraftthataddsorwidensaruleofapolicysetthatappliestotheagent.Forexample:||wiki,invented|postgres,adaptive-pg-mcp||---|---|---||Theagentholds|wiki-eng,whichcoversthespaceeng|postgres-sales-eu,whichcoversthedatabasesales_eu||Itsdraftadds|thespacelegaltowiki-eng|thedatabasesales_ustopostgres-sales-eu||Thecheckanswers|thedraftwouldletitreachtoolsonspacesofwikithatitsrolesdonotcovertoday|thesame,ondatabasesofpostgres|AnagentalsocannotproposeaStrazarole,acommandorcontainerserver,aRegomodule,arulethatletsarequesterapprovetheirowncalls,orachangetoconversationrecording.Withoutanactivesponsor,anagentcannotproposeanything,becauseanagent'sdraftneedsapersonaccountableforit.Thecheckdoesnotrefuseanagent'sdraftthatloosensapolicysetthatappliestotheagent,forexamplebyturningitoff.Ontheconsole,itshowsunderawarningthatnamestheagent,asalinethatwidensaccess.Thepublishertypestheset'snametoacceptit,sotherecordofthepublishnameswhoaccepted.Whileasecondpersonisrequired,theagent'ssponsorcannotpublishsuchadraft.##TheappsdirectoryTheStrazaserverwatchesadirectoryforMCPservermanifests,soyoucankeepthemingit.Afilethatappearsorchangestherebecomesadraft,andadeletedfilebecomesadraftthatremovesitsserver.Nofileinstalls,changesorremovesaserverbyitself.Strazaneverwritestothedirectory.Ifafileholdsasecret,itsdraftisrefusedandkeepsnoneofthefile'sbytes.Strazareadsonlyservermanifestsfromthedirectory.Whichobjectsarolecoversissetintherole'sowndocument,whichyouproposeasaseparatedraft.[Theappsdirectory](https://docs.straza.ai/guides/serve-mcp-apps/gitops-apps-directory/index.md)setsitup.##WhatyourIGAsees[YourIGA](https://docs.straza.ai/evaluate/identity-and-your-iga/index.md)readseachroleasaSCIMgroupandneverseesadraft.Aroleappearsthereoncethedraftthatcreatesitispublished,andtheIGAcannotcreate,renameordeletearole.Eachgroupcarriesaread-onlylistofwhatitsrolegrants:theservers,thetools,theobjectsitcoversandthelivepolicysetsthatnameit.Apublishthatchangesarolemarksitaschanged,sotheIGAreadsthegroupagainatitsnextpoll.Aroleassignmentisnotadraft.WhenyourIGA,oranadminonstandalone,assignsarole,theassignmenttakeseffectatonceandneverwaitsforasecondperson.AnassignmentthatneedsreviewbelongsinyourIGA'sownapproval,andonstandaloneintheadmin'sownprocess.Whatanexpertneedshere:Adraftholdsatmost1MiBofdocumentsandnote,andatmost1,000items.Aproposerkeepsatmost10opendrafts,andanoteholdsatmost2,000bytes.Anagentsubmitsatmostonedraftevery10seconds,anditsopendraftexpires14daysafteritslatestrevision.Adraftfromtheconsole,anadminAPItokenortheappsdirectorydoesnotexpire,as[Lifetimesandtimeouts](https://docs.straza.ai/reference/lifetimes-and-timeouts/index.md#changes-and-drafts)lists.Strazadoesnotconnecttoanaddressthatonlyadraftnames,sothecheckofanewremoteservercannotlistitstoolsatfirst.ApersonmayaskStrazatocontactitonce,withnocredentialandnoredirect,andtheauditchainrecordswhoasked.Whileasecondpersonisrequired,adirectwritewhosechecklistsariskisrefusedtoeverycaller,anditsrefusalsaystosavethechangeasadraft.Pausingaserverdoesnotgothroughadraft,soincidentresponseneverwaitsforasecondperson.Theagentreadsitsdraft'srefusedlines,risks,warningsanduncheckedlines,soitcanfixarefusalitselfandsubmitanewrevision.Thereviewerseesanotefromanagentastheagent'sownwords,markedunverified.Everycreate,check,publish,discardandexpiryofadraftwritesanauditrecord.TherecordofadraftfromtheappsdirectorynamesthefileanditsSHA-256butnoactor.Itspublishrecordnamesthepersonwhopublishedit.Next:[People,agentsandsponsors](https://docs.straza.ai/concepts/identities/index.md)



